package org.student.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 项目名称:
 * 类名称: DateUtil
 * 类描述: 对字符串和日期之间的格式相互转化
 * 创建人：严植培
 * 创建时间: 2011-9-1 下午04:41:07
 */
public class DateUtil {

	public static final String yyMMdd = "yy-MM-dd" ;
	public static final String yyyyMMdd = "yyyy-MM-dd" ;
	public static final String HHmmss = "HH:mm:ss" ;
	public static final String yyyyMMddHHmmss = "yyyy-MM-dd HH:mm:ss" ;
	public static final String yyMMddHHmmss = "yy-MM-dd HH:mm:ss" ;
	public static final String downLoadDate = "yyyyMMddHHmmss" ;
	public static final String chargeTime = "yyyy.MM.dd hh:mm:ss" ;
	public static final String fileDate = "yyyyMMdd" ;
	public static final String fileDay = "hhmmss" ;
	public static final String fileMonth = "yyyyMM" ;

	/**
	 * 获得年月日期当前月最后一天,日期形式:yyyymm
	 * @param str 日期字符串
	 * @return
	 */
	public static String getLastDayOfMonth(String str) {
		String year = null ; // 声明String对象
		String month = null ; // 声明String对象
		String dd = null ; // 声明String对象
		if (str.length() == 6) {
			year = str.substring(0,4) ;
			month = str.substring(4) ;
		}
		if (year != null && month != null) {
			int yyyy = Integer.valueOf(year) ; // 转换int类型
			int mm = Integer.valueOf(month) ; // 转换int类型
			Calendar c = Calendar.getInstance() ; // 实例化Calendar对象
			c.set(Calendar.YEAR, yyyy) ; // 设置年份
			c.set(Calendar.MONTH, mm - 1); // 设置月份
			int lastDay = c.getActualMaximum(Calendar.DAY_OF_MONTH); // 这就是最后一天
			dd = String.valueOf(lastDay) ; // 转换成字符串
		}
		if (dd != null) {
			return str + dd ;
		} else {
			return null ;
		}
	}

	/**
	 * yyyy-M-d,yyyy-MM-dd,yyyyMMMdd,yyyy-MM-d,yyyy-M-dd,yyyyMMdd转换成yyyyMMdd
	 * @param str
	 * @return
	 */
	public static String parseToString(String str) {
		String temp = null ;
		if (str.contains("/")) { // 是否包含
			str = str.replace("/", "-") ; // 替换字符
		}
		if (str.length() == 9) { // yyyy-M-dd
			if (str.contains("-")) {
				int index = str.indexOf("-");
				int lastindex = str.lastIndexOf("-");
				if (index != -1 && lastindex != -1) {
					String yy = str.substring(0, index) ;
					String mm = str.substring(index + 1, lastindex) ;
					String dd = str.substring(lastindex + 1) ;
					if (mm.length() == 1) {
						mm = "0" + mm;
					}
					if (dd.length() == 1) {
						dd = "0" + dd ;
					}
					temp = yy + mm + dd ;
					return temp ;
				} else {
					return null ;
				}
			} else {
				return null ;
			}
		} else if (str.length() == 10) { // yyyy-MM-dd
			if (str.contains("-")) {
				temp = str.replace("-", "") ;
				if (temp.length() == 8) {
					return temp ;
				} else {
					return null ;
				}
			} else {
				return null ;
			}
		} else if (str.length() == 8) { // yyyy-m-d
			if (str.contains("-")) {
				temp = str.replace("-", "0") ;
				return temp ;
			} else {
				return temp = str ;
			}
		} else {
			return null ;
		}
	}

	/**
	 * 根据日期样式将字符串转化为日期类型
	 * @param s 要转化的字符串
	 * @param style 转化的格式
	 * */
	public static Date parseToDate(String s, String style) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat() ; // 实例化SimpleDateFormate对象
		simpleDateFormat.applyPattern(style) ; // 设置日期样式　
		Date date = null ; // 声明Date对象
		if (s == null || s.length() < 8)
			return null ;
		try {
			date = simpleDateFormat.parse(s) ; // 转换成日期类型
		} catch (ParseException e) {
			e.printStackTrace() ;
		 }
		return date ;
	}

	/**
	 * 修改日期样式
	 * @param s 要转化的字符串
	 * @param style 转化的格式
	 * */
	public static String parseToString(String s, String style) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat() ; // 实例化SimpleDateFormate对象
		simpleDateFormat.applyPattern(style) ;  // 设置样式
		Date date = null ;
		String str = null ;
		if (s == null || s.length() < 8)
			return null ;
		try {
			date = simpleDateFormat.parse(s) ; // 转换成日期类型
			str = simpleDateFormat.format(date) ; // 转换成String类型
		} catch (ParseException e) {
			e.printStackTrace() ;
		}
		return str ;
	}

	/**
	 * 将日期转化为字符串
	 * @param date 要转化的日期
	 * @param styl 转化的样式
	 * */
	public static String parseToString(Date date, String style) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat() ; // 实例化SimpleDateFormate对象
		simpleDateFormat.applyPattern(style) ; // 设置样式
		String str = null ;
		if (date == null){
			return null ;
		}
		str = simpleDateFormat.format(date) ; // 转换成String类型
		return str ;
	}

	/**
	 * @return 返回当前系统时间来保存excel文件
	 */
	public static String getDate() {
		Date date = new Date();
		SimpleDateFormat dateformate = new SimpleDateFormat(yyyyMMddHHmmss);
		String save_file_name = dateformate.format(date);
		return save_file_name;
	}

	/**
	 * @return 返回当前系统时间来保存excel文件
	 */
	public static String getDate(Date date) {
		SimpleDateFormat dateformate = new SimpleDateFormat(yyyyMMddHHmmss);
		String save_file_name = dateformate.format(date);
		return save_file_name;
	}

	/**
	 * @return 返回当前系统时间来保存excel文件
	 */
	public static String getDownLoadDate() {
		Date date = new Date() ; // 实例化Date对象
		SimpleDateFormat dateformate = new SimpleDateFormat(downLoadDate) ; // 实例化SimpleDateFormat对象	
		String save_file_name = dateformate.format(date) ; // 转换String类型
		return save_file_name ; 
	}

	public static String getChargeTime(Date rechargeTime) {
		Date date = rechargeTime;
		SimpleDateFormat dateformate = new SimpleDateFormat(chargeTime);
		String save_file_name = dateformate.format(date);
		return save_file_name;
	}

	/**
	 * 功能：得到当前月份第一天  格式为：xxxx-yy-zz (eg: 2007-12-01)
	 * 
	 * @author 谢韧
	 * @param curDate 传入当前日期 (格式:2009-7)
	 * @return String
	 */
	public static String thisMonth(String curDate) {
		int year, month ; 
		String strY = null ;
		year = Integer.parseInt(curDate.split("-")[0]) ;
		month = Integer.parseInt(curDate.split("-")[1]) ;
		strY = month >= 10 ? String.valueOf(month) : ("0" + month);
		return year + "-" + strY + "-01";
	}

	/**
	 * 功能：得到当前月份最后一天  格式为：yyyy-mm-dd (eg: 2007-12-31)
	 * @param curDate 传入当前日期(格式:2009-7)
	 * @return String
	 */
	public static String thisMonthEnd(String curDate) {
		String strY = null ; // 声明String对象
		String strZ = null ; // 声明String对象
		int year, month ;
		boolean leap = false ; // 定义错误标志位
		year = Integer.parseInt(curDate.split("-")[0]) ; // 取得年份
		month = Integer.parseInt(curDate.split("-")[1]) ; // 取得月份
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
			strZ = "31" ;
		}
		if (month == 4 || month == 6 || month == 9 || month == 11) {
			strZ = "30" ;
		}
		if (month == 2) {
			leap = leapYear(year) ; // 判断是否闰年
			if (leap) {
				strZ = "29" ;
			} else {
				strZ = "28" ;
			}
		}
		strY = month >= 10 ? String.valueOf(month) : ("0" + month) ;
		return year + "-" + strY + "-" + strZ ;
	}

	/**
	 * 判断输入年份是否为闰年<br>
	 * @param year
	 * @return 是：true 否：false
	 * @author pure
	 */
	public static boolean leapYear(int year) {
		boolean leap = false ; // 定义错误标志位
		if (year % 4 == 0) {
			if (year % 100 == 0) {
				if (year % 400 == 0){
					leap = true ;
				}else{
					leap = false ;
				}
			} else{
				leap = true ;
			}
		} else{
			leap = false ;
		}
		return leap ;
	}

	/**
	 * 计算两时间相隔时间间隔
	 * @param startday
	 * @param endday
	 * @return
	 */
	public static int getIntervalDays(Date startday, Date endday) {
		long sl = startday.getTime() ; // 取得当前时间
		long el = endday.getTime() ; // 取得当前时间
		long ei = el - sl;
		return (int) (ei / (1000 * 60));
	}
/*	
	public static void main(String args[])throws Exception{
		SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
		Date d = s.parse("2011-8-31") ;
		System.out.println(DateUtil.getIntervalDays(d,new Date())) ;
	}*/
}